import {
  ArgumentsHost,
  Catch,
  ExceptionFilter,
  HttpException,
} from '@nestjs/common'

/**
 * @description 异常过滤器 拦截所有异常——MD文件中介绍
 */
@Catch(HttpException)
export class HttpExceptionFilter implements ExceptionFilter<HttpException> {
  /**
   *
   * @param exception 当前正在处理的异常对象——MD文件中介绍
   * @param host ArgumentsHost 对象是一个强大的实用程序对象
   * 我们使用它来获取对传递给原始请求处理程序（在异常产生的控制器中）的 Request 和 Response 对象的引用。
   * [https://nest.nodejs.cn/exception-filters#built-in-http-exceptions]地址
   */
  catch(exception: HttpException, host: ArgumentsHost) {
    const ctx = host.switchToHttp() // 获取请求上下文
    const response = ctx.getResponse() // 获取请求上下文中的 response对象
    const status = exception.getStatus() // 获取异常状态码
    const exceptionResponse: any = exception.getResponse()
    let validMessage = ''

    for (const key in exception) {
      console.log(`🧧🧨 → `, key, exception[key])
    }
    if (typeof exceptionResponse === 'object') {
      const msg = exceptionResponse.message
      validMessage = typeof msg === 'string' ? msg : msg[0]
    }
    const message =
      exception.message || `${status >= 500 ? 'Service Error' : 'Client Error'}`
    const errorResponse = {
      data: {},
      message: validMessage || message,
      code: status,
    }

    // 设置返回的状态码， 请求头，发送错误信息
    response.status(status)
    response.header('Content-Type', 'application/json; charset=utf-8')
    response.send(errorResponse)
  }
}
